home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: delta
/
whiteline CD Series - delta.iso
/
tex
/
tools
/
dvi_300b
/
treiber
/
dvinadel.lzh
/
dvinadel
/
dvi_low.s
< prev
next >
Wrap
Text File
|
1995-09-20
|
8KB
|
326 lines
; ======================================================
;
; Ein paar schnell Low-Level-Routinen für den Ausdruck
; mit DVI.APP
;
; Version 1.1
; Copyright (c) Markus Kohm, 1995
;
; Diese Routinen wurden für PASM umgeschrieben und
; sind deshalb nicht getestet!
; Wer einen anderem Assembler verwendet muß lediglich
; die ".MODULE xyz" durch "xyz:" ersetzen und die
; ".ENDMOD" rauswerfen.
; Wird weder Pure noch Turbo C verwendet, muß außerdem
; die Parameterübergabe angepaßt werden.
;
; ======================================================
USEPRN=1 ; Standardausgabekanal verwenden
.GLOBL Fwrite, Fopen, Fcreate, Fseek, Fclose
.BSS
; int prt_handle;
.MODULE prt_handle
.ds.w 1
.ENDMOD
.DATA
.IF USEPRN
; const char *STANDARDPRN = "PRN:";
.MODULE STANDARDPRN
.dc.b "PRN:",0,0
.ELSE
; const char *PRINTBRD = "PRINTBRD";
.MODULE PRINTBRD
.dc.b "PRINTBRD",0,0
.ENDIF
.ENDMOD
.DATA
; const char *DEFAULTPRINTBRD = "C:\\PRINTBRD";
.MODULE DEFAULTPRINTBRD
.dc.b "C:\PRINTBRD",0
.ENDMOD
.TEXT
; int prt_open( const char *filename );
.GLOBL prt_open
.GLOBL getenv, Tgettime, Tgetdate ;wird benötigt
.MODULE prt_open
move.l A0,D0
bne weiter2
.IF USEPRN
lea.l STANDARDPRN,A0
.ELSE
lea.l PRINTBRD,A0
bsr getenv
move.l A0,D0
bne makename
lea.l DEFAULTPRINTBRD,A0
makename: link A6,#-128
move.l A5,-(A7)
lea.l 4(A7),A5
cpyloop: move.b (A0)+,(A5)+
bne cpyloop
moveq #'\',D0
cmp.b -2(A5),D0
beq weiter1
move.b D0,-1(A5)
clr.b (A5)+
weiter1: addq.l #7,A5
bsr Tgettime
moveq #3,D2
timeloop: move.b D0,D1
lsr.w #4,D0
and.b #15,D1
cmp.b #9,D1
bls digit1
add.b #'A',D1
bra tloope
digit1: add.b #'0',D1
tloope: move.b D1,-(A5)
dbra D2,timeloop
bsr Tgetdate
moveq #3,D2
dateloop: move.b D0,D1
lsr.w #4,D0
and.b #15,D1
cmp.b #9,D1
bls digit2
add.b #'A',D1
bra dloope
digit2: add.b #'0',D1
dloope: move.b D1,-(A5)
dbra D2,dateloop
addq.l #8,A5
move.b #'.',(A5)+
move.b #'P',(A5)+
move.b #'R',(A5)+
move.b #'T',(A5)+
move.b #0,(A5)
move.l (A7)+,A5
move.l A7,A0
bra weiter3
.ENDIF
weiter2: link A6,#0
weiter3: moveq #1,D0
move.l A0,-(A7)
bsr Fopen
move.l (A7)+,A0
tst.l D0
bmi test
move.w D0,prt_handle
move.w D0,D1
moveq #0,D0
moveq #2,D2
bsr Fseek
ok: moveq #0,D0
ende: unlk A6
rts
test: cmp.l #-33,D0
bne ende
moveq #0,D0
bsr Fcreate
tst.l D0
bmi ende
move.w D0,prt_handle
bra ok
.ENDMOD
.TEXT
; int prt_close(void);
.GLOBL prt_close
.MODULE prt_close
move.w prt_handle,D0
bra Fclose
.ENDMOD
.TEXT
; int prt_byte(int byte);
.GLOBL prt_byte
.MODULE prt_byte
move.w D0,-(A7)
lea.l 1(A7),A0
moveq #1,D1
move.w prt_handle,D0
bsr Fwrite
addq.l #2,A7
rts
.ENDMOD
.TEXT
; long prt_string(const char *str);
.GLOBL prt_string
.MODULE prt_string
movea.l A0,A1
moveq.l #-1,D1
moveq.l #1,D0
loop: add.l D0,D1
move.b (A1)+,D2
bne loop
tst.l D0
beq end
move.w prt_handle,D0
bra Fwrite
end: rts
.ENDMOD
.TEXT
; long prt_block(const char *block, long size);
.GLOBL prt_block
.MODULE prt_block
move.l D0,D1
move.w prt_handle,D0
bra Fwrite
.ENDMOD
.TEXT
; void prt_prtcpy(char *dst, char *srs,
; int bytesperline, int width,
; int headheight);
.GLOBL prt_prtcpy
.MODULE prt_prtcpy
SaveRegs REG D4-D7/A2
movem.l #SaveRegs,-(A7)
moveq #7,D4 ;7. Bit bis 0. Bit testen
bra loop1e
loop1: ;Es wird die gesamte Breite von links nach rechts durchlaufen
movea.l A1,A2 ;A2 = Adresse der aktuellen Zeile
move.w D2,D5 ;D5 = Byteläufer
bra loop2e
loop2: moveq #7,D6 ;7. Bit bis 0. Bit setzen
moveq #0,D7 ;und zwar hier
loop3: btst D4,(A2) ;ist das D4. Quell-Bit gesetzt?
beq bitisok ;nein: ---> Bit richtig gesetzt
bset D6,D7 ;ja: D6. Zielbit setzen
bitisok: adda.w D0,A2
loop3e: dbra D6,loop3 ;nächstes Zielbit
move.b D7,(A0)+ ;Zielbyte schreiben
loop2e: dbra D5,loop2 ;headheight durchlaufen
subq.w #1,D4 ;nächstes Quellbit
bcc loop1 ;in diesem Byte: ---> dabei bleiben
addq.l #1,A1 ;nächstes Byte
moveq #7,D4 ;wieder ab Bit 7
loop1e: dbra D1,loop1
movem.l (A7)+,#SaveRegs
rts
.ENDMOD
.TEXT
; void prt_prtcpysome(char *dst, char *srs,
; int bytesperline, int width,
; int headheight, int pixellines);
.GLOBL prt_prtcpysome
.MODULE prt_prtcpysome
SaveRegs REG D3-D7/A2
movem.l #SaveRegs,-(A7)
move.w 28(A7),D3 ;pixellines
moveq #7,D4 ;7. Bit bis 0. Bit testen
bra loop1e
loop1: ;Es wird die gesamte Breite von links nach rechts durchlaufen
move.w D3,D7 ;alle erlaubten Zeilen
movea.l A1,A2 ;A2 = Adresse der aktuellen Zeile
move.w D2,D5 ;D5 = Byteläufer
bra loop2e
loop2: moveq #8,D6 ;7. Bit bis 0. Bit setzen
bra loop3e
loop3: btst D4,(A2) ;ist das D4. Quell-Bit gesetzt?
beq bitisok ;nein: ---> Bit richtig gesetzt
bset D6,(A0) ;ja: D6. Zielbit setzen
bitisok: adda.w D0,A2
loop3e: subq.w #1,D7
dble D6,loop3 ;nächstes Zielbit
addq.l #1,A0
loop2e: move.b #0,(A0) ;löschen
dbra D5,loop2 ;headheight durchlaufen
subq.w #1,D4 ;nächstes Quellbit
bcc loop1 ;in diesem Byte: ---> dabei bleiben
addq.l #1,A1 ;nächstes Byte
moveq #7,D4 ;wieder ab Bit 7
loop1e: dbra D1,loop1
movem.l (A7)+,#SaveRegs
rts
.ENDMOD
.TEXT
; long prt_whitebytes(char *buffer, long bytes);
.GLOBL prt_whitebytes
.MODULE prt_whitebytes
move.l D0,D1
bne precnt
moveq #0,D0
rts
precnt: moveq #0,D0
preloop: move.l A0,D2
and.l #3,D2
beq maincnt
tst.b (A0)+
bne ende
addq.l #1,D0
subq.l #1,D1
bne preloop
bra ende
maincnt: move.l D1,D2
beq ende
lsr.l #2,D2
beq postcnt
mainloop: tst.l (A0)+
bne ppostcnt
addq.l #4,D0
subq.l #1,D2
bne mainloop
bra postcnt
ppostcnt: subq.l #4,A0
moveq #3,D1
postcnt: and.l #3,D1
beq ende
postloop: tst.b (A0)+
bne ende
addq.l #1,D0
subq.l #1,D1
bne postloop
ende: rts
.ENDMOD
.TEXT
; void *memor( void *dst, const void *srs, unsigned long size );
.GLOBL memor
.MODULE memor
move.l A0,D1
beq ende
loop: move.b (A1)+,D2
or.b D2,(A0)+
subq.l #1,D0
bne loop
move.l D1,A0
ende: rts
.ENDMOD